home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 11 / Cream of the Crop 11-2.iso / os2 / os2cl015.zip / pmwin.cpp < prev    next >
C/C++ Source or Header  |  1995-11-24  |  14KB  |  651 lines

  1. /* 
  2.  
  3.  
  4.     pmwin.cpp (emx+gcc) 
  5.  
  6.     1995 Giovanni Iachello
  7.     This is freeware software. You can use or modify it as you wish,
  8.     provided that the part of code that I wrote remains freeware.
  9.     Freeware means that the source code must be available on request 
  10.     to anyone.
  11.     You must also include this notice in all files derived from this
  12.     file.
  13.  
  14.  
  15. */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <stdarg.h>
  20.  
  21. #include "pmwin.h"
  22. #include "pmgpi.h"
  23. #include "pmdlg.h"
  24. #include "pmhelp.h"
  25. #include "pmstdres.h"
  26.  
  27.  
  28. MRESULT PMWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  29. {
  30.     PMWin* win=NULL;
  31.  
  32.     win = (PMWin*)WinQueryWindowPtr(hwnd, 0);
  33.  
  34.     if (win) {
  35.         PMEvent event(msg,mp1,mp2,CHARMSG(&msg),MOUSEMSG(&msg));
  36.         MRESULT ret=win->msgProc(event);
  37.         if (msg==WM_DESTROY) delete win; // cancella l'oggetto se viene distrutta la finestra.
  38.         return ret;
  39.     }
  40.     return WinDefWindowProc(hwnd,msg,mp1,mp2);
  41. }
  42.  
  43.  
  44. /////////////////////////////////////////////////////////////////////////////
  45.  
  46. PMWin::PMWin(HAB iab)
  47. {
  48.     ab.PMAnchorBlock(iab);
  49.     createArgs=NULL;
  50.     hwnd=(HWND)0;
  51.     hwndFrame=(HWND)0;
  52.     oldproc=WinDefWindowProc; // per sicurezza
  53. }
  54.  
  55. PMWin::PMWin(PCSZ classname,HAB iab)
  56. {
  57.     ab.PMAnchorBlock(iab);
  58.     createArgs=new WINCREATEARGS;
  59.     hwnd=(HWND)0;
  60.     hwndFrame=(HWND)0;
  61.     oldproc=WinDefWindowProc; // per sicurezza
  62.     
  63.     createArgs->hwndParent=HWND_DESKTOP;
  64.     createArgs->flStyle= WS_VISIBLE;
  65.     createArgs->flCreateFlags=(FCF_TITLEBAR | FCF_SYSMENU |
  66.                   FCF_SIZEBORDER | FCF_MINMAX |
  67.                   FCF_SHELLPOSITION | FCF_TASKLIST);
  68.     createArgs->pszClientClass=classname;
  69.     createArgs->pszTitle=NULL;
  70.     createArgs->styleClient=0L;
  71.     createArgs->hmod=(HMODULE)0;
  72.     createArgs->idResources=0;
  73.     createArgs->phwndClient=&hwnd;
  74.  
  75.     createArgs->hab=iab;
  76.     createArgs->pszClassName=classname;
  77.     createArgs->pfnWndProc=PMWndProc;
  78.     createArgs->flClassStyle=CS_SIZEREDRAW;
  79.     createArgs->cbWindowData=sizeof(this);
  80. }
  81.  
  82. PMWin::~PMWin()
  83. {
  84.     delete createArgs;
  85. }
  86.  
  87. BOOL PMWin::createWin()
  88. {
  89.     HWND newhwnd;
  90.  
  91.     CLASSINFO temp;
  92.     if (!WinQueryClassInfo(ab,createArgs->pszClassName,&temp)) {
  93.         BOOL ret=WinRegisterClass (createArgs->hab, createArgs->pszClassName, 
  94.             createArgs->pfnWndProc,createArgs->flClassStyle, createArgs->cbWindowData);
  95.         assert(ret);
  96.     }
  97.     
  98.     oldproc=WinDefWindowProc;
  99.     
  100.     newhwnd = WinCreateStdWindow (createArgs->hwndParent,createArgs->flStyle,
  101.                 &createArgs->flCreateFlags,createArgs->pszClientClass,
  102.                 createArgs->pszTitle,createArgs->styleClient,createArgs->hmod, 
  103.                 createArgs->idResources,createArgs->phwndClient);
  104.     assert(newhwnd);
  105.     hwndFrame=newhwnd;
  106.     BOOL ret=WinSetWindowPtr(hwnd, 0, this);
  107.     assert(ret);
  108.     return hwnd;
  109. }
  110.  
  111. MRESULT PMWin::msgProc(PMEvent &event)
  112. {
  113.     event.ret=MRFROMSHORT(FALSE);
  114.     return dispachEvent(event) ? event.ret : (*oldproc)(hwnd,event.msg,event.mp1,event.mp2);
  115. }
  116.  
  117. BOOL PMWin::dispachEvent(PMEvent & event)
  118. {
  119.     if ((event.msg>=WM_MOUSEFIRST && event.msg<=WM_MOUSELAST) ||
  120.             (event.msg>=WM_EXTMOUSEFIRST && event.msg<=WM_EXTMOUSELAST) ) {
  121.         return mouse(event);
  122.     } else if (event.msg>=HM_MSG_BASE && event.msg<=HM_CONTROL) {
  123.         return helpmsg(event);
  124.     } else
  125.         switch (event.msg) {
  126.         case WM_CREATE:
  127.             return create(event);
  128.         case WM_CHAR: 
  129.             return kbd(event);
  130.         case WM_COMMAND:
  131.             return command(SHORT1FROMMP (event.mp1),SHORT2FROMMP (event.mp2));
  132.         case WM_PAINT:
  133.             return paint();
  134.         case WM_ENABLE:
  135.             return enable();
  136.         case WM_SHOW:
  137.             return show();
  138.         case WM_MOVE:
  139.             return move();
  140.         case WM_SIZE:
  141.             return size(SHORT1FROMMP (event.mp2),SHORT2FROMMP (event.mp2));
  142.         case WM_ACTIVATE:
  143.             return activate();
  144.         case WM_SETFOCUS:
  145.             return setfocus();
  146.         case WM_HELP:
  147.             return help(event);
  148.         case WM_TIMER:
  149.             return timer();
  150.         case WM_CLOSE:
  151.             return closed();
  152.         case WM_PRESPARAMCHANGED:
  153.             invalidate(TRUE);
  154.             return TRUE;
  155.         case WM_INITMENU:
  156.             PMMenu* menu=new PMMenu(HWNDFROMMP(event.mp2));
  157.             return initmenu(SHORT1FROMMP(event.mp1),menu);
  158.             delete menu;
  159.         }               
  160.     return other(event);
  161. }
  162.  
  163. BOOL PMWin::create(PMEvent &event)
  164. {
  165.     return FALSE;
  166. }
  167.  
  168. BOOL PMWin::command(USHORT id,USHORT cmddev)  // nothandled
  169. {
  170.     return FALSE;
  171. }
  172.  
  173. BOOL PMWin::paint()
  174. {
  175.     return FALSE;
  176. }
  177.  
  178. BOOL PMWin::kbd(PMEvent &event)
  179. {
  180.     return FALSE;
  181. }
  182.  
  183. BOOL PMWin::mouse(PMEvent &event)
  184. {
  185.     return FALSE;
  186. }
  187.  
  188. BOOL PMWin::enable()
  189. {
  190.     return FALSE;
  191. }
  192. BOOL PMWin::show()    
  193. {
  194.     return FALSE;
  195. }
  196. BOOL PMWin::move()
  197. {
  198.     return FALSE;
  199. }
  200. BOOL PMWin::size(SHORT,SHORT)
  201. {
  202.     return FALSE;
  203. }
  204. BOOL PMWin::activate()
  205. {
  206.     return FALSE;
  207. }
  208. BOOL PMWin::setfocus()
  209. {
  210.     return FALSE;
  211. }
  212. BOOL PMWin::help(PMEvent &)
  213. {
  214.     return FALSE;
  215. }
  216. BOOL PMWin::helpmsg(PMEvent &)
  217. {
  218.     return FALSE;
  219. }
  220.  
  221. BOOL PMWin::timer()
  222. {
  223.     return FALSE;
  224. }
  225. BOOL PMWin::closed()
  226. {
  227.     return FALSE;
  228. }
  229.  
  230. BOOL PMWin::other(PMEvent &event)
  231. {
  232.     return FALSE;
  233. }
  234.  
  235. MRESULT PMWin::close() 
  236.     return sendMsg(WM_CLOSE); 
  237. }
  238.  
  239. BOOL PMWin::destroyWin()
  240. {
  241.     return WinDestroyWindow(hwndFrame);
  242. }
  243.  
  244. BOOL PMWin::initmenu(SHORT id,PMMenu* menu)
  245. {
  246.     return FALSE;
  247. }
  248.  
  249.  
  250. /////////////////////////////////////////////////////////////////////////////
  251.  
  252. BOOL PMWin::ptInClient(PMPoint& pt)
  253. {
  254.     PMRect rcl;
  255.     rcl=this;
  256.     return WinPtInRect (ab, &rcl, &pt);
  257. }
  258.  
  259. /////////////////////////////////////////////////////////////////////////////
  260.  
  261. PMMessageQueue::PMMessageQueue()
  262. {
  263.     hmq=0;
  264. }
  265.  
  266. PMAnchorBlock::PMAnchorBlock()
  267. {
  268.     hab=0;
  269. }
  270.  
  271. PMAnchorBlock::~PMAnchorBlock()
  272. {
  273. }
  274.  
  275. void PMAnchorBlock::init(int flags)
  276. {
  277.     hab = WinInitialize(flags);
  278. }
  279.  
  280. void PMAnchorBlock::uninit(void)
  281. {
  282.     WinTerminate(hab);
  283. }
  284.  
  285.  
  286. PMApp::PMApp(PMAnchorBlock iab,PMMessageQueue imq,int iargc,char** iargv)
  287. {
  288.     ab=iab; 
  289.     mq=imq;
  290.     argc=iargc;
  291.     argv=iargv;
  292. }
  293.  
  294. void PMApp::quit(int ret)
  295. {
  296. }
  297.  
  298. void PMApp::run(void)
  299. {
  300.     QMSG qmsg;
  301.     while ( ab.getMsg( &qmsg ) ) 
  302.         ab.dispachMsg ( &qmsg );
  303. }
  304.  
  305. /////////////////////////////////////////////////////////////////////////////
  306.  
  307. PMMainWin::PMMainWin(PCSZ classname,HAB ab,PMHelpWin *ihelpWin) : PMWin(classname,ab) 
  308.     helpWin=ihelpWin;
  309.     caption=NULL;
  310.     modified=FALSE;
  311.     filename[0]='\0';
  312.     fileFlags=PMMWFF_NOTHING;
  313.     fileNone="(none)"; fileUntitled="(untitled)";
  314.     flCaption=fsCaption=fnFilter=NULL;
  315. }
  316.  
  317. // supporto per help inline (usa tutto create della classe base, e aggiunge
  318. // l'associazione automatica alla finestra di help!)
  319.  
  320. BOOL PMMainWin::createWin()
  321. {
  322.     BOOL ret;
  323.     ret=PMWin::createWin();
  324.     if (helpWin) ret&=associateHelpInstance(helpWin->getHwnd());
  325.     return ret;
  326. }
  327.  
  328. BOOL PMMainWin::destroyWin()
  329. {
  330.     BOOL ret;
  331.     if (helpWin) {
  332.         ret=associateHelpInstance(NULLHANDLE);
  333.         ret&=PMWin::destroyWin();
  334.     } else ret=PMWin::destroyWin();
  335.     return ret;
  336. }
  337.  
  338. BOOL PMMainWin::paint() 
  339. {
  340.     PMWindowPresSpace ps(this);
  341.     return paint(ps);
  342. }
  343.  
  344. BOOL PMMainWin::closed()
  345. {
  346.     if (queryEnd()) postMsg(WM_QUIT);
  347.     return TRUE;
  348. }
  349.  
  350. BOOL PMMainWin::fileKillConfirm()
  351. {
  352.     if (!modified) return TRUE;
  353.     char buf[160];
  354.     strcpy(buf,"Save Changes");
  355.     if (fileFlags==PMMWFF_FILE) {
  356.         strcat(buf," to ");
  357.         strcat(buf,filename);
  358.     }
  359.     strcat(buf,"?");
  360.     int ret=WinMessageBox(HWND_DESKTOP,HWND_DESKTOP,(PCSZ)buf,(PCSZ)caption,0,MB_YESNOCANCEL|MB_ICONHAND|MB_APPLMODAL);
  361.     if (ret==MBID_YES) command(PMIDM_FILESAVE,0);
  362.     if (ret==MBID_CANCEL) return FALSE;
  363.     return TRUE;        
  364. }
  365.  
  366.  
  367. void PMMainWin::setTitleCaption()
  368. {
  369.     char temp[256];
  370.     if (caption==NULL) temp[0]='\0';
  371.     else {
  372.         switch (fileFlags) {
  373.         case PMMWFF_NOTHING:
  374.             sprintf(temp,"%s",caption);
  375.             break;
  376.         case PMMWFF_NONE:
  377.             if (modified)
  378.                 sprintf(temp,"%s - *%s",caption,fileNone);
  379.             else
  380.                 sprintf(temp,"%s - %s",caption,fileNone);
  381.             break;
  382.         case PMMWFF_UNTITLED:
  383.             if (modified)
  384.                 sprintf(temp,"%s - *%s",caption,fileUntitled);
  385.             else
  386.                 sprintf(temp,"%s - %s",caption,fileUntitled);
  387.             break;
  388.         case PMMWFF_FILE:
  389.             if (modified)
  390.                 sprintf(temp,"%s - *%s",caption,filename);
  391.             else
  392.                 sprintf(temp,"%s - %s",caption,filename);
  393.             break;
  394.         }
  395.     }
  396.     setFrameWindowText(temp);
  397. }
  398.  
  399. BOOL PMMainWin::command(USHORT id,USHORT cmddev)
  400. {
  401.     switch(id) {
  402.     case PMIDM_FILENEW:
  403.         if (fileKillConfirm()) {
  404.             if (fileNew()) { fileFlags=PMMWFF_UNTITLED; setModified(FALSE);    }
  405.         }
  406.         return TRUE;
  407.     case PMIDM_FILEOPEN: {
  408.         if (fileKillConfirm()) {
  409.             PMFileDialog fd(HWND_DESKTOP, hwnd, fnFilter, flCaption, "Open", FDS_OPEN_DIALOG);
  410.             int ret=fd.createWin();
  411.             if (ret==1) {
  412.                 FILEDLG fi=fd;
  413.                 if (fileOpen(fi.szFullFile)) { // se caricato cambia il filename
  414.                         strcpy(filename,fi.szFullFile);
  415.                     fileFlags=PMMWFF_FILE;
  416.                 }
  417.                 setModified(FALSE);
  418.             }
  419.         }
  420.         return TRUE;
  421.         }    
  422.     case PMIDM_FILESAVE: 
  423.         if (filename[0]) { // se c'e' filename salva con quello
  424.             fileSave(filename);
  425.             setModified(FALSE);
  426.             return TRUE;
  427.         } // altrimenti ricadi in save as
  428.     case PMIDM_FILESAVEAS: {
  429.         PMFileDialog fd(HWND_DESKTOP, hwnd, fnFilter, fsCaption, "Save", FDS_SAVEAS_DIALOG);
  430.         int ret=fd.createWin();
  431.         if (ret==1) {
  432.             FILEDLG fi=fd;
  433.             if (fileSave(fi.szFullFile)) { // se caricato cambia il filename
  434.                 strcpy(filename,fi.szFullFile);
  435.                 fileFlags=PMMWFF_FILE;
  436.             }
  437.             setModified(FALSE);
  438.         }
  439.         return TRUE;
  440.         }    
  441.     case PMIDM_FILEPRINT :
  442.         filePrint();
  443.         return TRUE;
  444.     case PMIDM_FILEEXIT :
  445.         close();
  446.         return TRUE;
  447.  
  448.     case PMIDM_EDITUNDO :
  449.         editUndo();
  450.         return TRUE;
  451.     case PMIDM_EDITREDO :
  452.         editRedo();
  453.         return TRUE;
  454.     case PMIDM_EDITCUT :
  455.         editCut();
  456.         return TRUE;
  457.     case PMIDM_EDITCOPY :
  458.         editCopy();
  459.         return TRUE;
  460.     case PMIDM_EDITPASTE:
  461.         editPaste();
  462.         return TRUE;
  463.     case PMIDM_EDITCLEAR:
  464.         editClear();
  465.         return TRUE;
  466.     case PMIDM_EDITDUPLICATE :
  467.     case PMIDM_EDITSELECTALL :
  468.         return FALSE;
  469.  
  470.     case PMIDM_HELPINDEX :
  471.         helpWin->sendMsg(HM_HELP_INDEX);
  472.         return TRUE;
  473.     case PMIDM_HELPGENERAL :
  474.         helpWin->sendMsg(HM_EXT_HELP);
  475.         return TRUE;
  476.     case PMIDM_HELPUSING :
  477.         helpWin->sendMsg(HM_DISPLAY_HELP);
  478.         return TRUE;
  479.     case PMIDM_HELPKEYS :
  480.         helpWin->sendMsg(HM_KEYS_HELP);
  481.         return TRUE;
  482.  
  483.     case PMIDM_HELPABOUT :
  484.         WinDlgBox(HWND_DESKTOP,hwnd,(PFNWP)PMDlgProc,NULLHANDLE,PMDLG_ABOUT,NULL);
  485.         return TRUE;
  486.  
  487.     }
  488.     return FALSE;
  489. }
  490.  
  491.  
  492. /////////////////////////////////////////////////////////////////////////////
  493.  
  494. static MRESULT PMSubclassWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  495. {
  496.     PMWin* win=NULL;
  497.  
  498.     win = (PMWin*)WinQueryWindowPtr(hwnd, 0);
  499.  
  500.     if (win) {
  501.         PMEvent event(msg,mp1,mp2,CHARMSG(&msg),MOUSEMSG(&msg));
  502.         MRESULT ret=win->msgProc(event);
  503.         if (msg==WM_DESTROY) delete win; // cancella l'oggetto se viene distrutta la finestra.
  504.         return ret;
  505.     }
  506.     return WinDefWindowProc(hwnd,msg,mp1,mp2);
  507. }
  508.  
  509. PMSubclassWin::PMSubclassWin(HWND hwndParent, PCSZ pszClass, PCSZ pszName,
  510.     ULONG flStyle, LONG x, LONG y, LONG cx, LONG cy, HWND hwndOwner,
  511.        HWND hwndInsertBehind, ULONG id, PVOID pCtlData, PVOID pPresParams) : PMWin(NULLHANDLE)
  512. {
  513.     createArgs=new WINCREATEARGS;
  514.     
  515.     createArgs->hwndParent=hwndParent;
  516.     createArgs->pszClientClass=pszClass;
  517.     createArgs->pszTitle=pszName;
  518.     createArgs->flStyle=flStyle;
  519.     createArgs->x=x;
  520.     createArgs->y=y;
  521.     createArgs->cx=cx;
  522.     createArgs->cy=cy;
  523.     createArgs->hwndOwner=hwndOwner;
  524.     createArgs->hwndInsertBehind=hwndInsertBehind;
  525.     createArgs->id=id;
  526.     createArgs->pCtlData=pCtlData;
  527.     createArgs->pPresParams=pPresParams;
  528.     
  529. }
  530.  
  531. PMSubclassWin::~PMSubclassWin()
  532. {
  533. //    delete createArgs;
  534. }
  535.  
  536. BOOL PMSubclassWin::createWin()
  537. {
  538.     hwnd=WinCreateWindow(createArgs->hwndParent,
  539.                         createArgs->pszClientClass,
  540.                         createArgs->pszTitle,
  541.                         createArgs->flStyle,
  542.                         createArgs->x, createArgs->y,
  543.                         createArgs->cx, createArgs->cy,
  544.                         createArgs->hwndParent,
  545.                         createArgs->hwndInsertBehind,
  546.                         createArgs->id,
  547.                         createArgs->pCtlData,
  548.                         createArgs->pPresParams);
  549.     BOOL ret=WinSetWindowPtr(hwnd, 0, this);
  550.     assert(ret);
  551.     ab.PMAnchorBlock( WinQueryAnchorBlock(hwnd) );
  552.     oldproc=WinSubclassWindow(hwnd,PMSubclassWndProc);
  553.     return hwnd;
  554. }
  555.  
  556.  
  557. /////////////////////////////////////////////////////////////////////////////
  558.  
  559. PMThread::PMThread(void* iarg,int istacksize)
  560. {
  561.     arg=iarg;
  562.     stacksize=istacksize;
  563.     id=_beginthread(threadstart,NULL,stacksize,(void*)this);
  564. }
  565.  
  566. PMThread::~PMThread()
  567. {
  568. }
  569.  
  570. void threadstart(void* arg)
  571. {
  572.     PMThread* pmt=(PMThread*)arg;
  573.     pmt->threadStore(NULL);        // annulla il puntatore
  574.  
  575.     pmt->main(pmt->arg);
  576.  
  577.     delete pmt->threadStore();     // elimina la zona di memoria del thread
  578.     delete pmt;
  579.     _endthread();
  580. }
  581.  
  582. void PMThread::threadStore(void *p)
  583. {
  584.     (*_threadstore())=p;    
  585. }
  586.  
  587. void* PMThread::threadStore()
  588. {
  589.     return *_threadstore();
  590. }
  591.  
  592. void PMThread::main(void* )
  593. {
  594. }
  595.  
  596. PMWindowThread::PMWindowThread(void* iarg,int istacksize,int iflags) : 
  597.     PMThread(iarg,istacksize), PMAnchorBlock() 
  598. {
  599.     flags=iflags;
  600.     init(flags);
  601. }
  602.  
  603. PMWindowThread::~PMWindowThread()
  604. {
  605. }
  606.  
  607. void PMWindowThread::main(void* arg)
  608. {
  609. }
  610.  
  611. /////////////////////////////////////////////////////////////////////////////
  612.  
  613. void DoAssert(PCSZ msg,PCSZ file,unsigned line)
  614. {
  615.     char buf[160];
  616.     sprintf(buf,"at line %u in file %s: \"%s\"",line,file,msg);
  617.     if (WinMessageBox(HWND_DESKTOP,HWND_DESKTOP,buf,"ASSERTION FAILURE",0,MB_OKCANCEL|MB_ICONHAND|MB_APPLMODAL)!=MBID_OK) exit(-1);
  618. }
  619.  
  620. void ErrBox(PCSZ msg,...)
  621. {
  622.     char buf[256];
  623.  
  624.     va_list arg_ptr;
  625.     va_start(arg_ptr,msg);
  626.     vsprintf(buf,msg,arg_ptr);
  627.     va_end(arg_ptr);
  628.  
  629.     WinMessageBox(HWND_DESKTOP,HWND_DESKTOP,msg,"Error!",0,MB_CUACRITICAL|MB_APPLMODAL);
  630. }
  631.  
  632. ULONG PMWin::msgBox(PCSZ title,PCSZ msg,...)
  633. {
  634.     char buf[256];
  635.  
  636.     va_list arg_ptr;
  637.     va_start(arg_ptr,msg);
  638.     vsprintf(buf,msg,arg_ptr);
  639.     va_end(arg_ptr);
  640.     
  641.     return WinMessageBox(HWND_DESKTOP,HWND_DESKTOP,buf,title,0,MB_OK);
  642. }
  643.  
  644. /*
  645.  * Local variables:
  646.  * compile-command: "dmake pmwin.o"
  647.  * end:
  648.  */
  649.